package x.trident.core.auth.api;

import x.trident.core.auth.api.pojo.login.LoginUser;

import java.util.List;

/**
 * 关于User相关接口，需要使用Auth的程序自己实现
 *
 * @author jason.yan
 * @date 2022/6/22
 */
public interface AuthConfigApi {

    /**
     * 是否开启验证码校验
     *
     * @return Boolean
     */
    Boolean getCaptchaOpen();

    /**
     * 当前登录用户的加密后密码
     *
     * @return String
     */
    String getUserPasswordHexed();

    /**
     * 当前用户是否为正常可以被使用的状态，即不是禁用、冻结等状态
     *
     * @return Boolean
     */
    Boolean isUserStatusEnable();

    /**
     * 获得登录用户信息类
     *
     * @return LoginUser
     */
    LoginUser getLoginUser();

    /**
     * 获取不被权限控制的url
     *
     * @return string
     */
    List<String> getNoneSecurityConfig();

    /**
     * 用于auth校验的jwt的秘钥
     *
     * @return string
     */
    String getAuthJwtSecret();

    /**
     * 用于auth模块权限校验的jwt失效时间
     * <p>
     * 这个时间也是“记住我”功能的过期时间，默认为7天
     * <p>
     * 如果登录的时候开启了“记住我”，则用户7天内免登录
     *
     * @return Long
     */
    Long getAuthJwtTimeoutSeconds();

    /**
     * 获取session过期时间，默认3600秒
     * <p>
     * 在这个时段内不操作，会将用户踢下线，从新登陆
     * <p>
     * 如果开启了记住我功能，在session过期后会从新创建session
     *
     * @return Long
     */
    Long getSessionExpiredSeconds();

    /**
     * 获取单账号单端登录的开关
     * <p>
     * 单账号单端登录为限制一个账号多个浏览器登录
     *
     * @return true-开启单端限制，false-关闭单端限制
     */
    boolean getSingleAccountLoginFlag();

    /**
     * 获取携带token的header头的名称
     *
     * @return string
     */
    String getAuthTokenHeaderName();

    /**
     * 获取携带token的param传参的名称
     *
     * @return string
     */
    String getAuthTokenParamName();

    /**
     * 会话保存在cookie中时，cooke的name
     *
     * @return string
     */
    String getSessionCookieName();

    /**
     * 默认解析jwt的秘钥（用于解析sso传过来的token）
     *
     * @return string
     */
    String getSsoJwtSecret();

    /**
     * 默认解析sso加密的数据的秘钥
     *
     * @return string
     */
    String getSsoDataDecryptSecret();

    /**
     * 获取是否开启sso远程会话校验，当系统对接sso后，如需同时校验sso的会话是否存在则开启此开关
     *
     * @return true-开启远程校验，false-关闭远程校验
     */
    Boolean getSsoSessionValidateSwitch();

    /**
     * sso会话远程校验，redis的host
     *
     * @return string
     */
    String getSsoSessionValidateRedisHost();

    /**
     * sso会话远程校验，redis的端口
     *
     * @return string
     */
    Integer getSsoSessionValidateRedisPort();

    /**
     * sso会话远程校验，redis的密码
     *
     * @return string
     */
    String getSsoSessionValidateRedisPassword();

    /**
     * sso会话远程校验，redis的db
     *
     * @return string
     */
    Integer getSsoSessionValidateRedisDbIndex();

    /**
     * sso会话远程校验，redis的缓存前缀
     *
     * @return string
     */
    String getSsoSessionValidateRedisCachePrefix();

    /**
     * 获取SSO服务器的地址
     *
     * @return string
     */
    String getSsoUrl();
}
